#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
// 对于close
// 从管道中读  返回0
//  管道中没有剩余数据  且  不存在管道的写者
// 从管道中读  阻塞
// 管道中没有剩余数据  存在管道的写者

// 读之前最好关闭管道的写者  否则会因为存在管道的写者而导致读的过程阻塞
int split(char *line, char *argv[]);
void read_pipe(char *command)
{
    char temp[100];
    memset(temp, 0, sizeof(temp));
    int fd[2];
    int pid;
    // 切分字符串
    int buff_size = strlen(command) + 1;
    char buff[buff_size];
    strcpy(buff, command);
    char *argv[8];
    int argc = split(buff, argv);
    // 产生子进程
    pipe(fd);
    pid = fork();
    if (pid == 0)
    {
        dup2(fd[1], 1);
        close(fd[0]);
        close(fd[1]);
        execvp(argv[0], argv);
        exit(0);
    }
    wait(NULL);
    dup2(fd[0], 0);
    close(fd[0]);
    close(fd[1]);
    // while (read(0, temp, sizeof(temp)))
    //     printf("%s", temp);
    while (1)
    {
        int count = read(0, temp, sizeof(temp));
        if (count < 0)
            perror("read file");
        if (count == 0)
            break;
        write(1, temp, count);
        // 此处不能用printf  由于%s期待一个以\0结尾的字符串  而read函数并不会自动
        // 的在temp最后加上结尾字符  所以可能出现一些问题   write 更加可靠
    }
    dup2(0, 0);
}
int split(char *line, char *argv[])
{
    int argc = 0;
    char *arg;
    arg = strtok(line, " ");
    while (arg != NULL)
    {
        argv[argc] = arg;
        argc++;
        arg = strtok(NULL, " ");
    }
    argv[argc] = NULL;
    return argc;
}
int main()
{
    printf("--------------------------------------------------\n");
    read_pipe("echo HELLO WORLD");
    printf("--------------------------------------------------\n");
    read_pipe("ls /");
    printf("--------------------------------------------------\n");
    return 0;
}